﻿using System;
using System.Drawing;
using System.Windows.Forms;
using ttt.kontrakte;

namespace ttt.frontend
{
    public partial class WinSpielbrett : Form, IFrontend
    {
        private Spielstand _spielstand;


        public WinSpielbrett()
        {
            InitializeComponent();
            RecalcBoard();
        }


        private void picSpielbrett_Click(object sender, EventArgs e)
        {
            var ce = (MouseEventArgs)e;

            var zug = new Zug { x = ce.X / this.cellWidth, y = ce.Y / this.cellHeight };
            this.Out_Spieler_zieht(zug);
        }


        private void neuesSpielToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Out_Neues_Spiel();
        }


        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }



        public void In_GeänderterSpielstand(Spielstand spielstand)
        {
            _spielstand = spielstand;
            this.picSpielbrett.Refresh();

            switch(spielstand.modus)
            {
                case Spielmodi.Gewonnen:
                    MessageBox.Show(string.Format("Spiel gewonnen durch Spieler {0}", spielstand.gewinner));
                    this.Out_Neues_Spiel();
                    break;

                case Spielmodi.Unentschieden:
                    MessageBox.Show("Das Spiel geht unentschieden aus.");
                    this.Out_Neues_Spiel();
                    break;
            }
        }

        public void In_UngültigerZug(Spielstand spielstand)
        {
            _spielstand = spielstand;
            this.picSpielbrett.Refresh();

            MessageBox.Show("Ungültiger Zug!");
        }


        public event Action<Zug> Out_Spieler_zieht;
        public event Action Out_Neues_Spiel;


        #region Spielbrett darstellen
        private int cellHeight;
        private int cellWidth;


        private void RecalcBoard()
        {
            this.cellHeight = picSpielbrett.Height / 3;
            this.cellWidth = picSpielbrett.Width / 3;
            picSpielbrett.Refresh();
        }


        private void picSpielbrett_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawLine(Pens.Blue, 0, cellHeight, picSpielbrett.Width, cellHeight);
            e.Graphics.DrawLine(Pens.Blue, 0, 2 * cellHeight, picSpielbrett.Width, 2 * cellHeight);

            e.Graphics.DrawLine(Pens.Blue, cellWidth, 0, cellWidth, picSpielbrett.Height);
            e.Graphics.DrawLine(Pens.Blue, 2 * cellWidth, 0, 2 * cellWidth, picSpielbrett.Height);

            for(var y=0; y<3; y++)
                for (var x = 0; x < 3; x++)
                    if (_spielstand.spielbrett.belegung[x, y] != Spieler.Leer)
                        DrawToken(e.Graphics, _spielstand.spielbrett.belegung[x,y] == Spieler.Kreis ? 'O' : 'X', x, y);
        }


        private void picSpielbrett_Resize(object sender, EventArgs e)
        {
            RecalcBoard();
        }


        private void DrawToken(Graphics g, char token, int col, int row)
        {
            using (var f = new Font("Arial", (int)(cellHeight * 0.9)))
            {
                var chSize = g.MeasureString(token.ToString(), f);
                g.DrawString(token.ToString(), f, Brushes.DarkBlue, col * this.cellWidth + (this.cellWidth - chSize.Width) / 2, row * this.cellHeight + (this.cellHeight - chSize.Height) / 2 + (int)(chSize.Height * 0.06));
            }
        }
        #endregion
    }
}
